cmake_minimum_required(VERSION 4.0.3)
 
# 标准库模块实验性 UUID ，请自行设置
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")
 
# 添加动态库
set(lib_name "HelloLib")
add_library(${lib_name} SHARED)
 
# 获取源文件列表
# file(GLOB_RECURSE CXX_MODULE_FILES "modules/*.cppm" "modules/*.ixx")
# file(GLOB_RECURSE CXX_CPP_FILES "src/*.cpp")

set(CXX_MODULE_FILES modules/Hello.cppm)
set(CXX_CPP_FILES src/Hello.cpp)

# 添加源文件与模块接口文件
target_sources(${lib_name} PRIVATE ${CXX_CPP_FILES})
target_sources(${lib_name} PUBLIC
        FILE_SET public_modules # FILE_SET任意取名
        TYPE CXX_MODULES    # 模块接口文件 需要使用 CXX_MODULES 类型
        BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/modules
        FILES ${CXX_MODULE_FILES}
)
# 设置 C++ 标准和标准库模块支持
set_target_properties(${lib_name} PROPERTIES
        CXX_STANDARD 23
        CXX_STANDARD_REQUIRED ON
        CXX_MODULE_STD 1
)
 
# 设置动态链接库的导出符号，MSVC与Clang/GNU的处理方式不同。
if(MSVC)
    target_compile_definitions(${lib_name} PRIVATE "LIB_EXPORT=__declspec(dllexport)")
else()
    target_compile_options(${lib_name} PRIVATE -fvisibility=hidden)
    target_compile_definitions(${lib_name} PRIVATE "LIB_EXPORT=__attribute__((visibility(\"default\")))")
endif()